home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Scheduling / Cassandra / Source / Global.m < prev    next >
Encoding:
Text File  |  1993-11-21  |  24.0 KB  |  860 lines

  1.  
  2. //
  3. // Global.m   Part of Cassandra
  4. //
  5. // Copyright (c) 1989, 1990, 1991 by Jiro Nakamura
  6. // All rights reserved
  7. //
  8. // RCS Information
  9. // Revision Number->    $Revision: 2.14 $
  10. // Last Revised->    $Date: 91/12/20 15:36:33 $
  11. //
  12. static char rcsid[] = "$Id: Global.m,v 2.14 91/12/20 15:36:33 jiro Exp Locker: jiro $";
  13.  
  14. #import "Global.h"
  15. #import <stdio.h>
  16. #import <libc.h>
  17. #import <strings.h>
  18. #import <stdlib.h>             // for atoi() 
  19. #import <sys/file.h>            // for access()
  20. #import    <math.h>            // for log10()
  21. #import <appkit/Button.h>
  22. #import <appkit/Window.h>
  23. #import <appkit/Form.h>
  24. #import <appkit/Application.h>      // for NXHomeDirectory()
  25. #import <defaults/defaults.h>        // for NXWriteDefault() 
  26. #import <appkit/Panel.h>        // for NXRunAlertPanel()
  27. #import <appkit/OpenPanel.h>        // for OpenPanel
  28. #import <appkit/publicWraps.h>  /* for NXBeep( )         */
  29.  
  30. #import "cass.h"
  31. #import "calendar.h"
  32. #import "Event.h"
  33. #import "Cassandra.h"
  34. const char *const alarmExtensions[] = ALARMEXTENSIONS;
  35.  
  36. BOOL getDefaultValue(char *defaultName, BOOL dflt)
  37. {
  38.     char *str;
  39.     str = (char *) NXGetDefaultValue(PROGNAME, defaultName);
  40.     return(    (!str || (str[0] == (dflt?'Y':'N')) ||
  41.         (str[0] == (dflt?'y':'n'))) ? dflt : !dflt) ;
  42. }
  43.     
  44. @implementation Global
  45. + initialize
  46. {
  47.     // From NeXT 0.9 Concepts manual, chap. 9, pp.13-16
  48.     static NXDefaultsVector myDefaults =
  49.         {
  50.             { DEFAULTALARMSOUND,        ALARMSOUND},
  51.             { DEFAULTALARMVOLUME,        "-1.0"},
  52.             { DEFAULTAUTOLAUNCHED,        "No" },
  53.             { DEFAULTCLOCKFACENUMBER,    "12"},
  54.             { DEFAULTCLOCKTYPE,        "0"},
  55.             { DEFAULTCOMPRESSEVENTS,    "Yes"},
  56.             { DEFAULTDIRECTORY,        NULL},
  57.             { DEFAULTEVENTLOGFRAME,        "x600y10w425h200"},
  58.             { DEFAULTEVENTLOGONLAUNCH,    "No"},
  59.             { DEFAULTFONTNAME,        FONTNAME},
  60.             { DEFAULTFONTSIZE,        FONTSIZEQ},
  61.             { DEFAULTGURU,            "No"},
  62.             { DEFAULTHIDEONLAUNCH        "No"},
  63.             { DEFAULTHIGHPRIORITY,        "90"},
  64.             { DEFAULTLOWPRIORITY,        "10"},
  65.             { DEFAULTMILITARYTIME,        "No"},
  66.             { DEFAULTNOTEPADFRAME,        "x75y10w425h200"},
  67.             { DEFAULTNOTEPADONLAUNCH,    "No"},
  68.             { DEFAULTOVERVIEWFRAME,        "x215y280w530h490"},
  69.             { DEFAULTOVERVIEWONLAUNCH,     "Yes"},
  70.             { DEFAULTPLAYALARM,        "Yes"},
  71.             { DEFAULTSAVESCREEN,        "No"},
  72.             { DEFAULTSCREENSAVER,        SCREENSAVER},
  73.             { DEFAULTSHOWSECONDS,         "Yes"},
  74.             { DEFAULTSHOWDATE,         "No"},
  75.             { DEFAULTSOURCELOGINONLAUNCH,    "No"},
  76.             { DEFAULTTODAYSHOWTIME,        "No"},
  77.             { DEFAULTTODAYONLAUNCH,        "Yes"},
  78.             { DEFAULTTODAYFRAME,        "x5y280w200h265"},
  79.             { DEFAULTWEEKFRAME,        "x78y15w870h165"},
  80.             { NULL}
  81.         };
  82.     
  83.     #ifdef DEBUG
  84.         fprintf(stderr, "Global being initialized\n");
  85.     #endif
  86.  
  87.     NXRegisterDefaults( PROGNAME, myDefaults);
  88.     return self;
  89. }
  90.  
  91. - load:sender
  92. {
  93.     const char *str;
  94.      char tmp[128];
  95.     
  96.     #ifdef DEBUG
  97.     int count;
  98.     for( count = 0; count < NXArgc; count ++ )
  99.         {
  100.         fprintf(stderr,"%s: NXArgv[%d] = <%s>\n", PROGNAME, count,
  101.             NXArgv[count]);
  102.         }
  103.     #endif
  104.     
  105.   
  106.     str = NXGetDefaultValue(PROGNAME, DEFAULTDIRECTORY);
  107.     if( str == NULL)
  108.         {
  109.         sprintf(directory, "%s%s", NXHomeDirectory(), DIRECTORY);
  110.         NXWriteDefault( PROGNAME, DEFAULTDIRECTORY, directory);
  111.         }
  112.     else
  113.         strcpy(directory, str);
  114.  
  115.     sprintf( eventFile, "%s%s", directory,         EVENTFILE);
  116.     sprintf( eventLogFile, "%s%s", directory,     EVENTLOGFILE);
  117.     sprintf( notepadFile, "%s%s", directory,     NOTEPADFILE);
  118.     sprintf( sourceLoginFile, "%s%s", directory,     SOURCELOGINFILE);
  119.     sprintf( sourceLogoutFile, "%s%s", directory,     SOURCELOGOUTFILE);
  120.     
  121.     strcpy(tmp, directory);
  122.         
  123.     if( *(tmp+ strlen(tmp)-1) == '/')
  124.         * (tmp+ strlen(tmp) -1) = '\0';
  125.     
  126.     if( access( tmp, X_OK) == -1)    // If it doesn't exist
  127.         {
  128.         if( mkdir(tmp, 0700) == -1)        
  129.             {
  130.             char error[180];
  131.             sprintf(error, "I couldn't create the working "
  132.                     "directory <%s>", tmp);
  133.             NXRunAlertPanel("Fatal Error", error, "Exit", 
  134.                     NULL,NULL);
  135.             exit(1);
  136.             }
  137.         }
  138.  
  139.     // Read the defaults and store them
  140.     autoLaunched    = getDefaultValue(DEFAULTAUTOLAUNCHED, NO);
  141.     compressEvents    = getDefaultValue(DEFAULTCOMPRESSEVENTS, YES);
  142.     eventLogOnLaunch= getDefaultValue(DEFAULTEVENTLOGONLAUNCH, YES);
  143.     guru         = getDefaultValue(DEFAULTGURU,         NO);
  144.     hideOnLaunch     = getDefaultValue(DEFAULTHIDEONLAUNCH,    NO);
  145.     militaryTime    = getDefaultValue(DEFAULTMILITARYTIME,    NO);
  146.     notepadOnLaunch = getDefaultValue(DEFAULTNOTEPADONLAUNCH, YES);
  147.     overviewOnLaunch= getDefaultValue(DEFAULTOVERVIEWONLAUNCH, YES);
  148.     playAlarm    = getDefaultValue(DEFAULTPLAYALARM,    YES);
  149.     saveScreen    = getDefaultValue(DEFAULTSAVESCREEN,     NO);
  150.     showSeconds    = getDefaultValue(DEFAULTSHOWSECONDS,     YES);
  151.     showDate    = getDefaultValue(DEFAULTSHOWDATE,    YES); 
  152.     sourceLoginOnLaunch    
  153.             = getDefaultValue(DEFAULTSOURCELOGINONLAUNCH,    NO);
  154.     todayOnLaunch    = getDefaultValue(DEFAULTTODAYONLAUNCH,    YES);
  155.     todayShowTime    = getDefaultValue(DEFAULTTODAYSHOWTIME, NO);
  156.     weekOnLaunch    = getDefaultValue(DEFAULTWEEKONLAUNCH,     NO);
  157.     
  158.     // Read the Overview window's frame size 
  159.     str = NXGetDefaultValue(PROGNAME, DEFAULTOVERVIEWFRAME);
  160.     sscanf(str, "x%fy%fw%fh%f",  
  161.         &overviewFrame.origin.x, &overviewFrame.origin.y, 
  162.         &overviewFrame.size.width, &overviewFrame.size.height);
  163.     
  164.     // Read the EventLog window's frame size 
  165.     str = NXGetDefaultValue(PROGNAME, DEFAULTEVENTLOGFRAME);
  166.     sscanf(str, "x%fy%fw%fh%f",  
  167.         &eventLogFrame.origin.x, &eventLogFrame.origin.y,
  168.         &eventLogFrame.size.width, &eventLogFrame.size.height);
  169.  
  170.     // Read the Notepad window's frame size 
  171.     str = NXGetDefaultValue(PROGNAME, DEFAULTNOTEPADFRAME);
  172.     sscanf(str, "x%fy%fw%fh%f",  ¬epadFrame.origin.x,
  173.         ¬epadFrame.origin.y, ¬epadFrame.size.width,
  174.         ¬epadFrame.size.height);
  175.  
  176.     // Read the Today window's frame size 
  177.     str = NXGetDefaultValue(PROGNAME, DEFAULTTODAYFRAME);
  178.     sscanf(str, "x%fy%fw%fh%f",  &todayFrame.origin.x,
  179.         &todayFrame.origin.y, &todayFrame.size.width,
  180.         &todayFrame.size.height);
  181.  
  182.     // Read the Week window's frame size 
  183.     str = NXGetDefaultValue(PROGNAME, DEFAULTWEEKFRAME);
  184.     sscanf(str, "x%fy%fw%fh%f",  &weekFrame.origin.x,
  185.         &weekFrame.origin.y, &weekFrame.size.width,
  186.         &weekFrame.size.height);
  187.  
  188.     // Read the sound default and process that.
  189.     strcpy(alarmSound, NXGetDefaultValue(PROGNAME, DEFAULTALARMSOUND));
  190.     
  191.     // Read the fontName default and process that.
  192.     strcpy(fontName, NXGetDefaultValue(PROGNAME, DEFAULTFONTNAME));
  193.  
  194.     // Read the ScreenSaver default and process that.
  195.     strcpy(screenSaver, NXGetDefaultValue(PROGNAME, DEFAULTSCREENSAVER));
  196.     
  197.     fontSize =     atof( NXGetDefaultValue(PROGNAME, DEFAULTFONTSIZE));
  198.     lowPriority =     atoi(NXGetDefaultValue(PROGNAME, DEFAULTLOWPRIORITY));
  199.     highPriority =     atoi( NXGetDefaultValue(PROGNAME,DEFAULTHIGHPRIORITY));
  200.     clockType =     atoi( NXGetDefaultValue(PROGNAME,DEFAULTCLOCKTYPE));
  201.     alarmVolume =     atof( NXGetDefaultValue(PROGNAME, DEFAULTALARMVOLUME));
  202.     clockBitmapNumber =     atoi(NXGetDefaultValue(PROGNAME, 
  203.                     DEFAULTCLOCKFACENUMBER));
  204.                             
  205.     #ifdef DEBUG
  206.         fprintf(stderr,"Global defaults read.\n");
  207.         fprintf(stderr,    
  208.             "Directory = <%s>\n"
  209.             "Alarm = %s, PlayAlarm = %s\n"
  210.             "alarmVolume = %f CompressEvents = %s\n"
  211.             "lowPriority = %d. highPriority = %d Guru = %s\n"
  212.             "ShowSeconds = %s, TodayShowTime = %s\n"
  213.             "ShowDate = %s, overviewOnLaunch = %s\n"
  214.             "ClockType = %d,\n"
  215.             "notepadOnLaunch = %s, eventLogOnLaunch = %s\n"
  216.             "todayOnLaunch = %s, hideOnLaunch = %s\n"
  217.             "alarmVolume = %1.3f\n"
  218.             "FontName = <%s>, FontSize = %3.1f\n"
  219.             "ClockBitmapNumber=%d, militaryTime = %s.\n"
  220.             "Overview:  x %.1f, y %.1f, w %.1f, h %.1f.\n"
  221.             "EventLog:  x %.1f, y %.1f, w %.1f, h %.1f.\n"
  222.             "Notepad:   x %.1f, y %.1f, w %.1f, h %.1f.\n"
  223.             "Today:     x %.1f, y %.1f, w %.1f, h %.1f.\n\n",
  224.             directory,
  225.             alarmSound, playAlarm?"Yes":"No",
  226.             alarmVolume, compressEvents?"Yes":"No",
  227.             lowPriority, highPriority, guru?"Yes":"No",
  228.             showSeconds?"Yes":"No", todayShowTime?"Yes":"No", 
  229.             showDate?"Yes":"No",overviewOnLaunch?"Yes":"No",
  230.             clockType,
  231.             notepadOnLaunch?"Yes":"No", 
  232.             eventLogOnLaunch?"Yes":"No",
  233.             todayOnLaunch?"Yes":"No", hideOnLaunch?"Yes":"No",
  234.             alarmVolume,
  235.             fontName, fontSize,
  236.             clockBitmapNumber, militaryTime?"Yes":"No",
  237.             overviewFrame.origin.x, overviewFrame.origin.y,
  238.             overviewFrame.size.width, overviewFrame.size.height,            
  239.             eventLogFrame.origin.x, eventLogFrame.origin.y,
  240.             eventLogFrame.size.width, eventLogFrame.size.height,                                    
  241.             notepadFrame.origin.x, notepadFrame.origin.y,
  242.             notepadFrame.size.width, notepadFrame.size.height,                                    
  243.             todayFrame.origin.x, todayFrame.origin.y,
  244.             todayFrame.size.width, todayFrame.size.height
  245.             );
  246.     #endif
  247.         return self;
  248. }
  249.  
  250. - display:sender
  251. {
  252.     [self load: self];
  253.     
  254.     [alarmSoundForm        setStringValue: alarmSound    at:0];
  255.     [alarmSoundButton    setState:    playAlarm];
  256.     [alarmSoundForm        setEnabled:    playAlarm];
  257.     [playButton        setEnabled:    playAlarm];
  258.     [setButton        setEnabled:    playAlarm];
  259.     [stopButton        setEnabled:    FALSE];
  260.     
  261.     [screenSaverButton    setState:    saveScreen];
  262.     [setScreenSaverButton    setEnabled:    saveScreen];
  263.     [testScreenSaverButton    setEnabled:    saveScreen];
  264.     [screenSaverForm    setEnabled:    saveScreen];
  265.     [screenSaverForm    setStringValue:    screenSaver at:0];
  266.     
  267.     [compressEventsButton    setState:    compressEvents];
  268.     [hideOnLaunchButton    setState:    hideOnLaunch];
  269.     [showSecondsButton    setState:    showSeconds];
  270.     [showDateButton        setState:    showDate];
  271.     [todayShowTimeButton    setState:    todayShowTime];
  272.     [overviewOnLaunchButton    setState:    overviewOnLaunch];
  273.     [notepadOnLaunchButton    setState:    notepadOnLaunch];
  274.     [eventLogOnLaunchButton    setState:    eventLogOnLaunch];
  275.     [sourceLoginOnLaunchButton setState:    sourceLoginOnLaunch];
  276.     [todayOnLaunchButton    setState:    todayOnLaunch];
  277.     [weekOnLaunchButton    setState:    weekOnLaunch];
  278.     [militaryTimeButton    setState:    militaryTime];
  279.  
  280.     [clockFaceMatrix    selectCellWithTag:    clockBitmapNumber];
  281.     [clockTypeButton    setState:        clockType];
  282.     
  283.     if( alarmVolume >= 0)
  284.         {
  285.         [volumeButton        setState:    TRUE];
  286.         [volumeSlider        setEnabled:    TRUE];
  287.         [volumeTextField    setStringValue: ""];
  288.         [volumeSlider        setFloatValue:    
  289.                         (float) pow(10,alarmVolume)];
  290.         }
  291.     else
  292.         {
  293.         float volL, volR;
  294.         
  295.         [Sound getVolume: &volL: &volR];
  296.         
  297.         [volumeTextField    setStringValue: "System Volume"];
  298.         [volumeSlider        setEnabled:    FALSE];
  299.         [volumeSlider        setFloatValue:    
  300.                     (float) pow(10,((volL+volR)/2))];
  301.         [volumeButton        setState:    FALSE];
  302.         }
  303.     
  304.     [self     makeKeyAndOrderFront:self];        
  305.     [self setDocEdited: FALSE];
  306.     return self;
  307. }
  308.  
  309. - save            // For compatibility with TextWindow save method
  310. {            // when called by Cassandra app
  311.  
  312.     [self    save: self];
  313.     return self;
  314. }
  315.  
  316. - save:sender
  317. {
  318.         char string[20];
  319.     BOOL changeQueue;
  320.  
  321.     changeQueue = FALSE;
  322.     
  323.     
  324.     guru = [guruButton state];
  325.     
  326.     saveScreen        = [screenSaverButton state];
  327.     strcpy(screenSaver,    [screenSaverForm stringValueAt: 0]);
  328.     
  329.     showSeconds         = [showSecondsButton state];
  330.     showDate         = [showDateButton state];
  331.     todayShowTime         = [todayShowTimeButton state];
  332.     hideOnLaunch        = [hideOnLaunchButton        state];
  333.     overviewOnLaunch     = [overviewOnLaunchButton     state];
  334.     notepadOnLaunch     = [notepadOnLaunchButton     state];
  335.     eventLogOnLaunch     = [eventLogOnLaunchButton    state];
  336.     sourceLoginOnLaunch    = [sourceLoginOnLaunchButton    state];
  337.     todayOnLaunch         = [todayOnLaunchButton        state];
  338.     weekOnLaunch         = [weekOnLaunchButton        state];
  339.     playAlarm        = [alarmSoundButton        state];
  340.     compressEvents        = [compressEventsButton        state];
  341.     militaryTime         = [militaryTimeButton state];
  342.     clockType        = [clockTypeButton         state];
  343.     
  344.     strcpy(alarmSound , (char *) [alarmSoundForm stringValueAt:0]);
  345.     alarmVolume    =     ([volumeButton        state]?
  346.                  (log10([volumeSlider        floatValue])):
  347.                 -1.0);        
  348.     
  349.     clockBitmapNumber = [clockFaceMatrix selectedTag];
  350.             
  351.         [cassandra defaultsDidChange:self];
  352.     [self    saveWindowPositions: self];
  353.     
  354.         NXWriteDefault(PROGNAME,DEFAULTALARMSOUND, alarmSound);        
  355.     NXWriteDefault(PROGNAME,DEFAULTSHOWSECONDS,(showSeconds?"Yes":"No"));
  356.     NXWriteDefault(PROGNAME,DEFAULTSAVESCREEN,(saveScreen?"Yes":"No"));
  357.     NXWriteDefault(PROGNAME,DEFAULTSHOWDATE,(showDate ? "Yes" : "No"));
  358.     NXWriteDefault(PROGNAME,DEFAULTTODAYSHOWTIME,
  359.         (todayShowTime ? "Yes" : "No"));
  360.     NXWriteDefault(PROGNAME,DEFAULTPLAYALARM, (playAlarm ? "Yes" : "No"));
  361.     NXWriteDefault(PROGNAME,DEFAULTCOMPRESSEVENTS,
  362.         (compressEvents?"Yes":"No"));
  363.                 
  364.     NXWriteDefault(PROGNAME,DEFAULTFONTNAME, fontName);
  365.     sprintf(string,"%3.1f",fontSize);
  366.     NXWriteDefault (PROGNAME, DEFAULTFONTSIZE,  string);
  367.  
  368.  
  369.     NXWriteDefault(PROGNAME, DEFAULTEVENTLOGONLAUNCH,
  370.         (eventLogOnLaunch ? "Yes" : "No"));
  371.     NXWriteDefault(PROGNAME, DEFAULTHIDEONLAUNCH,
  372.         (hideOnLaunch ? "Yes" : "No"));
  373.     NXWriteDefault(PROGNAME,DEFAULTNOTEPADONLAUNCH,
  374.         (notepadOnLaunch ?"Yes":"No"));
  375.     NXWriteDefault(PROGNAME, DEFAULTOVERVIEWONLAUNCH,
  376.         (overviewOnLaunch ? "Yes" : "No"));            
  377.     NXWriteDefault(PROGNAME, DEFAULTSOURCELOGINONLAUNCH,
  378.         (sourceLoginOnLaunch ? "Yes" : "No"));
  379.     NXWriteDefault(PROGNAME, DEFAULTTODAYONLAUNCH,
  380.         (todayOnLaunch ? "Yes" : "No"));
  381.     NXWriteDefault(PROGNAME, DEFAULTWEEKONLAUNCH,
  382.         (weekOnLaunch ? "Yes" : "No"));
  383.  
  384.  
  385.     NXWriteDefault(PROGNAME,DEFAULTMILITARYTIME,(militaryTime?"Yes":"No"));
  386.  
  387.     sprintf(string,"%d",clockType);
  388.     NXWriteDefault (PROGNAME, DEFAULTCLOCKTYPE, string);
  389.  
  390.     sprintf(string,"%f",alarmVolume);
  391.     NXWriteDefault (PROGNAME, DEFAULTALARMVOLUME, string);
  392.         sprintf (string, "%d", clockBitmapNumber);
  393.     NXWriteDefault(PROGNAME, DEFAULTCLOCKFACENUMBER, string);    
  394.     
  395.     #ifdef DEBUG
  396.         fprintf(stderr,"Global defaults written.\n");
  397.         fprintf(stderr,    
  398.             "Directory = <%s>\n"
  399.             "Alarm = %s, playAlarm = %s.\n"
  400.             "Guru = %s\n"
  401.             "ShowSeconds = %s, todayShowTime = %s\n"
  402.             "ShowDate = %s, clockType = %d\n"
  403.             "overviewOnLaunch = %s, hideOnLaunch = %s\n"
  404.             "notepadOnLaunch = %s, eventLogOnLaunch = %s\n"
  405.             "sourceLoginOnLaunch = %s,\n"
  406.             "FontName = <%s>, FontSize = %3.1f\n"
  407.             "alarmVolume = %f\n"
  408.             "ClockBitmapNumber=%d, militaryTime = %s.\n\n",
  409.             eventFile,  
  410.             alarmSound,     playAlarm?"Yes":"No", 
  411.             guru?"Yes":"No",
  412.             showSeconds?"Yes":"No", todayShowTime?"Yes":"No",
  413.             showDate?"Yes":"No", clockType,
  414.             overviewOnLaunch?"Yes":"No", hideOnLaunch?"Yes":"No",
  415.             notepadOnLaunch?"Yes":"No", 
  416.             eventLogOnLaunch?"Yes":"No",
  417.             sourceLoginOnLaunch?"Yes":"No",
  418.             fontName, fontSize,
  419.             alarmVolume,
  420.             clockBitmapNumber, militaryTime?"Yes":"No");
  421.     #endif
  422.  
  423.     [self setDocEdited: FALSE];
  424.         return self;
  425. }
  426.  
  427. // Method:        - saveWindowPositions: sender
  428. // Arguments:        id sender (ignored)
  429. // Description:        Saves the current window positions into the
  430. //            Defaults database.
  431. // Return Value:    self
  432. - saveWindowPositions: sender
  433. {    
  434.     #ifdef DEBUG
  435.         fprintf(stderr, "[global saveWindowPositions:sender]\n");
  436.     #endif
  437.         
  438.     [self    saveThisWindowPosition: DEFAULTOVERVIEWFRAME: overview];
  439.     [self    saveThisWindowPosition: DEFAULTNOTEPADFRAME: notepad];
  440.     [self    saveThisWindowPosition: DEFAULTEVENTLOGFRAME: eventLog];
  441.     [self    saveThisWindowPosition: DEFAULTTODAYFRAME: today];
  442.     [self    saveThisWindowPosition: DEFAULTWEEKFRAME: week];
  443.     return self;
  444. }
  445.  
  446. // Method:        - saveThisWindowPosition: (char *) defaultName :sender
  447. // Arguments:        (char *) defaultName -> the place in the defaults
  448. //                        database to save it
  449. //            (id) sender:    the sender window
  450. // Description:        Saves the current window position of the sender
  451. //             into the Defaults database.
  452. // Return Value:    self
  453. - saveThisWindowPosition: (char *) defaultName : (id) window
  454. {
  455.         char string[20];
  456.     NXRect windowFrame;
  457.     
  458.     #ifdef DEBUG
  459.         fprintf(stderr, "[global saveThisWindowPosition::]\n");
  460.     #endif
  461.         
  462.     if( ! [window isKindOf:     [Window class] ])
  463.         {
  464.         fprintf(stderr,"Global -> SaveThisWindowPosition ERROR:"
  465.             "Sender isn't of Window class. Contact Jiro.\n");
  466.         return self;
  467.         }
  468.             
  469.     if( [window isVisible])
  470.         {
  471.         [window getFrame: &windowFrame];
  472.            sprintf (string, "x%.0fy%.0fw%.0fh%.0f",
  473.             windowFrame.origin.x, windowFrame.origin.y,
  474.             windowFrame.size.width, windowFrame.size.height);
  475.         NXWriteDefault(PROGNAME, defaultName, string);    
  476.         #ifdef DEBUG
  477.             fprintf(stderr,"defaultName %s: %s\n",
  478.                 defaultName,string);
  479.         #endif
  480.         }
  481.     return self;
  482. }
  483.  
  484.  
  485. // Method:        - guru: sender
  486. // Arguments:        id sender (ignored)
  487. // Description:        Called when the user hits the guru button in
  488. //            Preferences window. Verifies that they want to do it.
  489. //
  490. - guru : sender
  491. {
  492.     /* If the guru button has been turned on */
  493.     if(  [guruButton state] == TRUE)
  494.         if( NXRunAlertPanel(NULL,"The Guru Editor is very dangerous. Are you sure you want to turn it on?","NO","Yes",NULL) == 1)
  495.             [guruButton setState: FALSE];
  496.     
  497.     [self windowChanged: self];
  498.     return self;
  499. }
  500.  
  501. - windowChanged: sender
  502. {
  503.     [self setDocEdited: TRUE];
  504.     return self;
  505. }
  506.  
  507. - clockTypeChanged: sender
  508. {
  509.     [self windowChanged: self];
  510.     clockType        = [clockTypeButton state];
  511.     if( clockType == CLOCK_DIGITAL)
  512.         [clockFaceMatrix setEnabled: FALSE];
  513.     return self;
  514. }
  515.  
  516. - close
  517. {    
  518.     #ifdef DEBUG
  519.         fprintf(stderr,"Global window about to close. "
  520.                 "Checking save.\n");
  521.     #endif
  522.     
  523.     if( [self isDocEdited] && [self isVisible])
  524.         {            
  525.          if (NXRunAlertPanel("Preferences not saved",
  526.                  "You have made changes to this window. "
  527.                 "Do you want to save them?",
  528.                 "Save","Don't Save",NULL) == 1 )
  529.             [self save: self];
  530.         }
  531.     [super close];
  532.     return self;
  533. }
  534.  
  535. - volumeButtonHit: sender
  536.     {
  537.     if( [volumeButton state])
  538.         {
  539.         float vol1, vol2;
  540.         
  541.         [Sound getVolume: &vol1: &vol2];
  542.         
  543.         [volumeSlider        setEnabled:    TRUE];
  544.         [volumeTextField    setStringValue:    ""];
  545.         [volumeSlider        setFloatValue:    
  546.             (float) pow(10,((vol1+vol2)/2))];
  547.         }
  548.     else
  549.         {
  550.         [volumeTextField    setStringValue: "System Volume"];
  551.         [volumeSlider        setEnabled:    FALSE];
  552.         }
  553.     return self;
  554.     }
  555.  
  556. - trackVolumeSlider: sender
  557.     {
  558.     alarmVolume =  log10([volumeSlider floatValue]);
  559.     [volumeTextField    setStringValue: ""];    
  560.     return self;
  561.     }
  562.  
  563. - screenSaverChanged: sender        // screensaver activated/deact
  564. {
  565.     BOOL state = [screenSaverButton state];
  566.     
  567.     [screenSaverForm    setEnabled: state];
  568.     [setScreenSaverButton    setEnabled: state];
  569.     [testScreenSaverButton    setEnabled: state];
  570.     [self windowChanged: self];
  571.     return self;
  572. }
  573.     
  574.     
  575. - testScreenSaver: sender    // test screensaver
  576. {
  577.     static char command[128];
  578.     
  579.     sprintf(command, "%s&", [self screenSaver]);
  580.     
  581.     #ifdef DEBUG
  582.         fprintf(stderr,"%s: System autodimmed w/ <%s>\n", 
  583.             PROGNAME, [self screenSaver]);
  584.         NXBeep(); NXBeep();
  585.     #endif
  586.     
  587.     system( command );
  588.     return self;
  589. }
  590.  
  591.  
  592. - setScreenSaver: sender        // set screensaver
  593. {
  594.     OpenPanel *myOpenPanel;
  595.     char tempDir[128], *tempFile;
  596.  
  597.     myOpenPanel = [OpenPanel new];
  598.     
  599.     if( index(screenSaver, '/') == (char *) 0)    // If the present isn't
  600.         strcpy( screenSaver, SCREENSAVER);    // a path to a ss
  601.         
  602.     strcpy(tempDir, screenSaver);
  603.     tempFile = rindex(tempDir,'/') + 1;
  604.     *(rindex (tempDir,'/')) = '\0';
  605.     
  606.  
  607.     #ifdef DEBUG
  608.         fprintf(stderr,"Open directory <%s> with file <%s>\n", 
  609.             tempDir, tempFile);
  610.     #endif
  611.     
  612.     if( [myOpenPanel    runModalForDirectory:    tempDir
  613.         file:    tempFile types: NULL]  == 0)
  614.             return self;
  615.     strcpy( screenSaver, [myOpenPanel filename]);
  616.     [screenSaverForm    setStringValue:    screenSaver    at: 0];
  617.     return self;
  618. }
  619.  
  620.  
  621.  
  622.  
  623. - checkScreenSaver: sender;        // see if valid screensaver
  624. {
  625.     if(  access( [screenSaverForm stringValueAt:0], R_OK) == -1)
  626.         {
  627.         NXRunAlertPanel("ScreenSaver not found",
  628.             "I couldn't find a file at that path. "
  629.                 "Please double check.",
  630.              "OK",NULL,NULL);
  631.         [screenSaverForm    selectText:self];
  632.         }
  633.     [self windowChanged: self];
  634.     return self;
  635. }
  636.  
  637.  
  638.  
  639. - sound: sender
  640.     {
  641.     if( [alarmSoundButton state])
  642.         {
  643.         [alarmSoundForm    setEnabled:    TRUE];
  644.         [playButton    setEnabled:    TRUE];
  645.         [setButton    setEnabled:    TRUE];
  646.         }
  647.     else
  648.         {
  649.         [alarmSoundForm    setEnabled:    FALSE];
  650.         [playButton    setEnabled:    FALSE];
  651.         [setButton    setEnabled:    FALSE];
  652.         }
  653.     return self;
  654.     }
  655.  
  656.  
  657. - playSound:sender
  658.     {
  659.     int error;
  660.     
  661.         
  662.     if( index((char *)[alarmSoundForm stringValueAt:0], '/')==(char *)0)
  663.         soundfile = [Sound findSoundFor:  
  664.             (char *) [alarmSoundForm stringValueAt:0]];
  665.     else
  666.         soundfile = [Sound newFromSoundfile: 
  667.             (char *) [alarmSoundForm stringValueAt:0]];
  668.         
  669.     if( soundfile != nil)
  670.             {
  671.             [soundfile setDelegate: self];
  672.             // From 1.0 Docs, Sound Kit, pp22-498
  673.             [Sound getVolume: &oldVolumeLeft:&oldVolumeRight];
  674.             if( [self volume] >= 0)
  675.                 [Sound setVolume: [self volume]
  676.                         : [self volume]];
  677.  
  678.             error = [soundfile play];
  679.             if( error == 0)        // No error
  680.                 {
  681.                 [stopButton     setEnabled    : TRUE];
  682.                 [playButton     setEnabled    : TRUE];
  683.                  }
  684.             else
  685.                 {
  686.                 char errorString[200];
  687.                 
  688.                 // Restore old volume
  689.                 [Sound    setVolume: oldVolumeLeft: 
  690.                         oldVolumeRight];
  691.  
  692.                 sprintf(errorString,
  693.                     "Error #%d (%s) occured while "
  694.                     "trying to play the sound <%s>.\n", 
  695.                     error, SNDSoundError(error),
  696.                     [alarmSoundForm stringValueAt:0]);
  697.                     
  698.                 NXRunAlertPanel("Alarm Error",errorString, 
  699.                         "Oh well...",NULL,NULL);
  700.                 }
  701.             }
  702.         else
  703.             {
  704.             NXRunAlertPanel("Sound not found",
  705.                 "I couldn't find that sound.", 
  706.                 "Oh well...",NULL,NULL);
  707.             [alarmSoundForm    selectText:self];
  708.             }
  709.     
  710.     return self;
  711.     }
  712.  
  713. - checkSound:sender
  714.     {
  715.     if(      ([Sound findSoundFor:  
  716.             (char *) [alarmSoundForm stringValueAt:0]] == nil)  ||
  717.         ( access( [alarmSoundForm stringValueAt:0], R_OK) == -1))
  718.         {
  719.         NXRunAlertPanel("Sound not found",
  720.             "I couldn't find that sound. Please double check.",
  721.              "OK",NULL,NULL);
  722.         [alarmSoundForm    selectText:self];
  723.         }
  724.     return self;
  725.     }
  726.  
  727.  
  728. - stopSound:sender
  729.     {
  730.     [soundfile stop];
  731.        return self;
  732.     }
  733.  
  734. - setSound: sender
  735.     {
  736.     OpenPanel *myOpenPanel;
  737.     char tempDir[128], *tempFile;
  738.  
  739.     myOpenPanel = [OpenPanel new];
  740.     
  741.     if( index(alarmSound, '/') == (char *) 0)    // If the present isn't
  742.         strcpy( alarmSound,ALARMSOUND);        // a path to a sound
  743.         
  744.     strcpy(tempDir, alarmSound);
  745.     tempFile = rindex(tempDir,'/') + 1;
  746.     *(rindex (tempDir,'/')) = '\0';
  747.     
  748.  
  749.     #ifdef DEBUG
  750.         fprintf(stderr,"Open directory <%s> with file <%s>\n", 
  751.             tempDir, tempFile);
  752.     #endif
  753.     
  754.     if( [myOpenPanel    runModalForDirectory:    tempDir
  755.         file:    tempFile types:  alarmExtensions]  == 0)
  756.             return self;
  757.     strcpy( alarmSound, [myOpenPanel filename]);
  758.     [alarmSoundForm    setStringValue:    alarmSound    at: 0];
  759.     return self;
  760.     }
  761.  
  762. - willPlay : sender
  763.     {
  764.     #ifdef DEBUG
  765.         fprintf(stderr,"Alarm sound starting with volume %f.\n",
  766.         [self volume]);
  767.     #endif
  768.     
  769.     [playButton setEnabled: FALSE];
  770.     return self;
  771.     }
  772.  
  773. - hadError : sender
  774.     {
  775.     char errorString[200];
  776.     int error = [[sender soundBeingProcessed] processingError];    
  777.     
  778.     sprintf(errorString,
  779.         "Error #%d (%s) occured while playing the sound <%s>.\n", 
  780.         error, SNDSoundError(error),
  781.         [alarmSoundForm stringValueAt:0]);
  782.                     
  783.     NXRunAlertPanel("Alarm Error",errorString, 
  784.             "Oh well...",NULL,NULL);
  785.         
  786.     [stopButton setEnabled: FALSE];
  787.     
  788.     if( [alarmSoundButton state])
  789.         [playButton    setEnabled:    TRUE];
  790.     else
  791.         [playButton    setEnabled:    FALSE];
  792.         
  793.     // Restore old volume
  794.     [Sound    setVolume: oldVolumeLeft: oldVolumeRight];
  795.     return self;
  796.     }
  797.  
  798. - didPlay:sender
  799.     {
  800.     [soundfile free];
  801.     [stopButton setEnabled: FALSE];
  802.         
  803.     if( [alarmSoundButton state])
  804.         [playButton    setEnabled:    TRUE];
  805.     else
  806.         [playButton    setEnabled:    FALSE];
  807.  
  808.     // Restore old volume
  809.     [Sound    setVolume: oldVolumeLeft: oldVolumeRight];
  810.      return self; 
  811.      }
  812.      
  813.      
  814. - (int) lowPriority        { return lowPriority; }
  815. - (int) highPriority        { return highPriority; }
  816. - (int) clockType        { return clockType; }
  817.  
  818. - (float) volume        { return alarmVolume; }
  819. - (double) fontSize        { return fontSize; }
  820.     
  821. - (const char *) alarmSound    { return alarmSound; }
  822. - (const char *) eventFile    { return eventFile; }
  823. - (const char *) eventLogFile    { return eventLogFile; }
  824. - (const char *) notepadFile    { return notepadFile; }
  825. - (const char *) fontName     { return fontName; }
  826. - (const char *) screenSaver    { return screenSaver; }
  827. - (const char *) sourceLoginFile    { return sourceLoginFile; }
  828. - (const char *) sourceLogoutFile    { return sourceLogoutFile; }
  829.     
  830. - (BOOL) autoLaunched        { return autoLaunched; }
  831. - (BOOL) compressEvents        { return compressEvents; }
  832. - (BOOL) eventLogOnLaunch    { return eventLogOnLaunch; }
  833. - (BOOL) guru            { return guru; }
  834. - (BOOL) hideOnLaunch        { return hideOnLaunch; }
  835. - (BOOL) notepadOnLaunch    { return notepadOnLaunch; }
  836. - (BOOL) overviewOnLaunch    { return overviewOnLaunch; }
  837. - (BOOL) playAlarm        { return playAlarm; }
  838. - (BOOL) saveScreen        { return saveScreen; }
  839. - (BOOL) showSeconds        { return showSeconds; }
  840. - (BOOL) showDate        { return showDate;}
  841. - (BOOL) sourceLoginOnLaunch    { return sourceLoginOnLaunch; }
  842. - (BOOL) todayOnLaunch        { return todayOnLaunch; }
  843. - (BOOL) todayShowTime        { return todayShowTime; }
  844. - (BOOL) militaryTime        { return militaryTime; }
  845. - (BOOL) weekOnLaunch        { return weekOnLaunch; }
  846.  
  847. - (NXRect *) overviewFrame    { return &overviewFrame; }
  848. - (NXRect *) eventLogFrame    { return &eventLogFrame; }
  849. - (NXRect *) notepadFrame    { return ¬epadFrame; }
  850. - (NXRect *) todayFrame        { return &todayFrame; }
  851. - (NXRect *) weekFrame         { return &weekFrame; }
  852.  
  853. - (const char *) clockfaceBitmapName
  854.     {
  855.     static char     bitmapName[30];
  856.     sprintf(bitmapName, "%s%d", BITMAPNAME, clockBitmapNumber);
  857.     return bitmapName;
  858.     }
  859. @end
  860.